package cn.demoncat.util.lang;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;

import cn.demoncat.util.lang.constant.StringConstant;

/**
 * 描述：拼音工具
 *
 * pinyin4j：汉字转拼音
 * jpinyin：pinyin4j的优化版，扩展词库、增加音标、繁简转换
 * 
 * @author 延晓磊
 *
 * @since 2017年7月10日
 */
public final class PinyinUtil {
	
	private static final Logger LOG = LoggerFactory.getLogger(PinyinUtil.class);
	
	/**
	 * 获取汉字简拼
	 * 
	 * @param str	汉字
	 * @return 	拼音首字母小写
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toSimple(String str) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		try {
			return PinyinHelper.getShortPinyin(str);
		} catch (Exception e) {
			LOG.error("获取汉字简拼失败：param = {}" + str, e);
			return StringConstant.EMPTY;
		}
	}

	/**
	 * 获取汉字拼音
	 * 
	 * @param str			汉字
	 * @param separator		拼音分隔符：null表示首字母大写分隔（默认），'' 表示不分隔，'空格' 表示空格分隔
	 * @param format		声调格式：WITH_TONE_MARK 带声调，WITH_TONE_NUMBER 数字声调，WITHOUT_TONE 不带声调（默认）
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toPinyin(String str, String separator, PinyinFormat format) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		// 默认首字母大写分隔
		boolean flag = false;
		if (separator == null) {
			flag = true;
			separator = StringConstant.DOUBLE_AT;
		}
		// 默认没有声调
		if (format == null) {
			format = PinyinFormat.WITHOUT_TONE;
		}
		// 转换拼音
		try {
			str = PinyinHelper.convertToPinyinString(str, separator, format);
		} catch (Exception e) {
			LOG.error("获取汉字拼音失败：param = {}" + str, e);
			return StringConstant.EMPTY;
		}
		// 首字母大写分隔
		if (flag) {
			String[] arr = StringUtils.split(str, StringConstant.DOUBLE_AT);
			StringBuilder sd = new StringBuilder();
			for (String item : arr) {
				sd.append(item.substring(0,1).toUpperCase()).append(item.substring(1));
			}
			str = sd.toString();
		}
		return str;
	}

	/**
	 * 获取汉字拼音：首字母大写，不带声调
	 * 
	 * @param str
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toPinyin(String str) {
		return toPinyin(str, null, null);
	}
	
	/**
	 * 获取汉字拼音：首字母小写，不带声调
	 * 
	 * @param str
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toPinyinLower(String str) {
		return toPinyin(str, StringConstant.EMPTY, null);
	}
	
	/**
	 * 获取汉字拼音：不带声调
	 * 
	 * @param str
	 * @param separator		拼音分隔符：null表示首字母大写分隔（默认），'' 表示不分隔，'空格' 表示空格分隔
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toPinyin(String str, String separator) {
		return toPinyin(str, separator, null);
	}
	
	/**
	 * 获取地址拼音：不带声调，去除省市县等地址后缀
	 * 
	 * @param str
	 * @param separator	拼音分隔符：null表示首字母大写分隔（默认），'' 表示不分隔，'空格' 表示空格分隔
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toAddrPinyin(String str, String separator) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		return toPinyin(AreaUtil.getShortName(str), separator);
	}
	
	/**
	 * 获取地址拼音：首字母大写，不带声调，去除省市县等地址后缀
	 * 
	 * @param str
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String toAddrPinyin(String str) {
		return toAddrPinyin(str,null);
	}
	
	
	/* ********************* pinyin4j ********************* */
	/*
	public static String toPinyin(String str) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		try {
			// 汉语拼音输出格式
			HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
			// 控制大小写：小写
			format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
			// 控制音调：不展示
			format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
			// 使用v代替u
			format.setVCharType(HanyuPinyinVCharType.WITH_V);
			StringBuilder sb = new StringBuilder();
			String[] array = null;
			char c;
			for (int i = 0; i < str.length(); i++) {
				c = str.charAt(i);
				array = PinyinHelper.toHanyuPinyinStringArray(c, format);
				if (array == null || array.length == 0) {
					// 处理非中文字符
					sb.append(c);
				} else {
					// 处理中文字符
					sb.append(array[0]);
					// 中文添加空格
					sb.append(StringConstant.SPACING);
				}
			}
			return sb.toString();
		} catch (Exception e) {
			LOG.error("获取汉字拼音失败：param = {}" + str, e);
			return StringConstant.EMPTY;
		}
	}
	*/

}
